﻿using System.Web;
using DoNet.Helper;
using DoNet.Platform.Wechat;
using DoNet.Platform.Wechat.Model;

namespace DoNet.OAuth2.Platform
{
    /// <summary>
    /// 微信授权登录
    /// 于网页授权回调域名的说明
    /// 微信公众号请求用户网页授权之前，开发者需要先到公众平台官网中的「设置与开发」-「功能设置」-「网页授权域名」的配置选项中，修改授权回调域名。请注意，这里填写的是域名（是一个字符串），而不是URL，因此请勿加 http:// 等协议头；
    /// 授权回调域名配置规范为全域名，比如需要网页授权的域名为：www.qq.com，配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com 无法进行OAuth2.0鉴权
    /// 如果公众号登录授权给了第三方开发者来进行管理，则不必做任何设置，由第三方代替公众号实现网页授权即可
    /// </summary>
    public class OAuthWechat : OAuthBase
    {
        /// <summary>
        /// 平台
        /// </summary>
        public override OAuthServer Platform
        {
            get
            {
                return OAuthServer.wechat;
            }
        }

        /// <summary>
        /// 获取Authorization Code 的URL
        /// </summary>
        /// <returns></returns>
        public override string GetAuthorizeURL()
        {
            
            return TokenApi.GetAuthorizeUrl(AppKey, HttpUtility.UrlEncode(CallbackUrl), "snsapi_base", "wechat");
        }

        /// <summary>
        /// 获取是否通过授权。
        /// </summary>
        public override bool Authorize()
        {
            if (!string.IsNullOrEmpty(code))
            {
                var result = AccessToken.GetAccessToken(AppKey, AppSecret, code);
                if (result != null)
                {
                    if (result.success)
                    {
                        var res = JsonHelper.DeserializeObject<dynamic>(result.data);
                        if (res != null)
                        {
                            token = res.access_token;
                            expiresTime = Convert.ToDateTime(res.expires_time);

                            openID = res.openid;

                            if (!string.IsNullOrEmpty(openID))
                            {
                                //获取授权用户信息
                                var res_user = TokenApi.GetUserInfo(token, openID);
                                if (res_user != null)
                                {
                                    if (res_user.success)
                                    {
                                        var userInfo = JsonHelper.DeserializeObject<UserInfo>(res_user.data);
                                        if (userInfo != null)
                                        {
                                            nickName = userInfo.nickname;
                                            headUrl = userInfo.headimgurl;
                                            return true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return false;
        }
    }
}
